//package com.java.main.pdf;
//
//import com.itextpdf.html2pdf.ConverterProperties;
//import com.itextpdf.html2pdf.HtmlConverter;
//import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
//import com.itextpdf.kernel.events.PdfDocumentEvent;
//import com.itextpdf.kernel.geom.PageSize;
//import com.itextpdf.kernel.geom.Rectangle;
//import com.itextpdf.kernel.pdf.PdfDocument;
//import com.itextpdf.kernel.pdf.PdfWriter;
//import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
//import com.itextpdf.layout.Document;
//import com.itextpdf.layout.font.FontProvider;
//import com.itextpdf.styledxmlparser.jsoup.helper.StringUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.io.IOUtils;
//
//import java.io.*;
//import java.lang.reflect.Field;
//import java.nio.charset.Charset;
//import java.nio.charset.StandardCharsets;
//import java.nio.file.Files;
//import java.util.List;
//import java.util.Optional;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
///**
// * html转pdf工具类
// * @author 顾志杰
// * @date  2023/12/21
// */
//@Slf4j
//public class TemplateToPDFUtils {
//
//    /**
//     * 通过html模版生成pdf
//     * 通过'${}'与实体内字段名称进行替换填充
//     * @param templateUrl 模版url
//     * @param data 填充内容
//     * @return 临时文件地址
//     * @param <T> 替换内容泛型
//     */
//    public static <T> String Pdf(String templateUrl,T data){
//        try {
//
//            String htmlStr = textReplace(htmlText(templateUrl), data);
//            InputStream inputStream = new ByteArrayInputStream(htmlStr.getBytes());
//            String tempDir = System.getProperty("java.io.tmpdir");
//            //标识字段
//            Field field = data.getClass().getDeclaredField("code");
//            field.setAccessible(true);
//            String code = (String) field.get(data);
//            //输出pdf
//            File outFile = new File(tempDir + File.separator  + code + ".pdf");
//            PdfWriter pdfWriter = new PdfWriter(outFile);
//            PdfDocument pdfDocument = new PdfDocument(pdfWriter);
//            Document doc = new Document(pdfDocument);
//            pdfDocument.setDefaultPageSize(PageSize.A4);
//            ConverterProperties pro = new ConverterProperties();
//            FontProvider fontProvider = new DefaultFontProvider();
//            //可以添加系统字体，但是linux可能没有中文字体需要手动添加或者直接添加到项目中resources里面
////            fontProvider.addSystemFonts();
//            fontProvider.addFont("simfang.ttf");
//            pro.setFontProvider(fontProvider);
//            pro.setCharset(StandardCharsets.UTF_8.name());
//            //页码
//            pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, event -> {
//                PdfDocumentEvent pdfEvent = (PdfDocumentEvent) event;
//                int pageNumber = pdfEvent.getDocument().getPageNumber(pdfEvent.getPage());
//                PdfCanvas canvas = new PdfCanvas(pdfEvent.getPage());
//                Rectangle pageSize = pdfEvent.getPage().getPageSize();
//                float y = pageSize.getBottom() + 20;
//                // 在页面底部右侧位置添加页码
//                canvas.beginText()
//                        .setFontAndSize(pdfEvent.getDocument().getDefaultFont(), 12)
//                        .moveText((pageSize.getRight() - doc.getRightMargin() + (pageSize.getLeft() + doc.getLeftMargin())) / 2,y)
//                        .showText(pageNumber+"")
//                        .endText();
//            });
//            HtmlConverter.convertToPdf(inputStream, pdfDocument,pro);
//            pdfWriter.close();
//            pdfDocument.close();
//            inputStream.close();
//            return tempDir + File.separator  + code + ".pdf";
//        } catch (IOException | IllegalAccessException | NoSuchFieldException e) {
//            log.error(e.getMessage());
//        }
//        return "";
//    }
//
//    /**
//     * 获取html字符串内容
//     * @param templateUrl 模版html地址
//     * @return html字符串内容
//     */
//    private static String htmlText(String templateUrl){
//        if(StringUtil.isBlank(templateUrl)){
//            throw new RuntimeException("templateUrl is null");
//        }
//        try {
//            InputStream resourceAsStream = TemplateToPDFUtils.class.getClassLoader().getResourceAsStream(templateUrl);
//            List<String> gbk = IOUtils.readLines(resourceAsStream, "GBK");
//            StringBuilder str  = new StringBuilder();
//            gbk.forEach(str::append);
//            return str.toString();
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
////    /**
////     * 获取html字符串内容
////     * @param templateUrl 模版html地址
////     * @return html字符串内容
////     */
////    private static String htmlText(String templateUrl){
////        if(StringUtil.isBlank(templateUrl)){
////            throw new RuntimeException("templateUrl is null");
////        }
////        try {
////            File file = new File(templateUrl); // 替换成你的HTML文件路径
////            BufferedReader br = new BufferedReader(new InputStreamReader(Files.newInputStream(file.toPath()), Charset.forName("GBK")));
////
////            String line;
////            StringBuilder htmlContent = new StringBuilder();
////            while ((line = br.readLine()) != null) {
////                htmlContent.append(line);
////            }
////            br.close();
////            System.out.println(htmlContent.toString());
////            return htmlContent.toString();
////        } catch (IOException e) {
////            throw new RuntimeException(e);
////        }
////    }
//
//
//    /**
//     * 内容替换，查询所有'${}'的匹配字符
//     * @param htmlStr html字符串
//     * @param data 替换填充内容
//     * @return 替换完成之后的html字符串
//     */
//    private static<T> String textReplace(String htmlStr, T data) throws IllegalAccessException {
//        Pattern pattern = Pattern.compile("\\$\\{([^}]*)\\}");
//        Matcher matcher = pattern.matcher(htmlStr);
//        // 执行替换
//        StringBuffer result = new StringBuffer();
//        while (matcher.find()) {
//            String parameterName = matcher.group(1); // 获取参数名
//            String replacement = getReplacement(parameterName,data); // 根据参数名获取实际替换的值
//            replacement  = Optional.ofNullable(replacement).orElse("");
//            // 将匹配的"${param}"替换为实际值
//            matcher.appendReplacement(result, Matcher.quoteReplacement(replacement));
//        }
//        matcher.appendTail(result);
//        return result.toString();
//    }
//
//
//    /**
//     * 内容替换，将'${}'匹配的字符与实体内的数据进行筛选查出需要替换的值
//     * @param parameterName 字符内容
//     * @param data 实体内容
//     * @return 需要替换成的值
//     */
//    private static <T> String getReplacement(String parameterName,T data) throws IllegalAccessException {
//        Field[] fields = data.getClass().getDeclaredFields();
//        for (Field field : fields) {
//            if (field.getName().equals(parameterName)) {
//                field.setAccessible(true);
//                return (String) field.get(data);
//            }
//        }
//        return "";
//    }
//}
